﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UtilityExtensions;

namespace DAL
{
    public partial class OrdenCompra
    {
        public decimal  GetTotalComparar()
        {

            
            // el total no puede ser mayor al total de la orden
            //si es con IGV o sin IGV
            decimal totalComparar = (this.Obra.incluyeIGV.Value) ? this.total.Value :
                                                                this.subTotal.Value;


            return totalComparar;

            
        }

        public int idAudit { get; set; }

        public int getidAnterior(dbGestionDataContext _db, int idinternal, int idObra,int idTipoOrden)
        {
            int intAnterior = 0;


            var id = from i in _db.OrdenCompras
                     where i.idInternal < idinternal && i.idObra == idObra & i.idTipoOrden == idTipoOrden
                     group i by i.idObra into g
                     select new
                     {
                         idAnterior = g.Max(p => p.idInternal)
                     };

            if (id.Count() > 0)
            {
                intAnterior = id.First().idAnterior;

            }
            else
            {
                throw new Exception("No existe Registros");
            }


            return intAnterior;

        }

        public int getidSiguiente(dbGestionDataContext _db, int idinternal, int idObra, int idTipoOrden)
        {
            int intSiguiente = 0;

            //revisar la sentencia generada
            var id = from i in _db.OrdenCompras
                     where i.idInternal > idinternal && i.idObra == idObra & i.idTipoOrden == idTipoOrden
                     group i by i.idObra into g
                     select new
                     {
                         idSiguiente = g.Min(p => p.idInternal)
                     };


            if (id.Count() > 0)
            {
                intSiguiente = id.First().idSiguiente;

            }
            else
            {
                throw new Exception("No existe Registros");
            }

            return intSiguiente;
        }

        public string getCorrelativoCompra(dbGestionDataContext _db, int idObra)
        {
            // fecha: 04/10/2011
            //  Correlativo por empresa:
            int idEmpresa = _db.Obras.Single(p => p.idInternal == idObra).Proyecto.idEmpresa.Value;

            string numDocumento ="00000001";


            var q = from a in _db.OrdenCompras
                    where a.Obra.Proyecto.idEmpresa == idEmpresa
                    & a.idTipoOrden == 1
                    group a by a.Obra.Proyecto.idEmpresa into g
                        select new
                        {
                            idObra=g.Key,
                            numDocumento=g.Max(p=>p.numDocumento)
                        };
            if (q.Count()>0)
            {
                

                int numActual = int.Parse(q.First().numDocumento);
                //if (idEmpresa == 6)
                //{
                //    if (numActual < 10999)
                //    {
                //        numActual = 10999;
                //    }
                //}

                numActual++;
                if (numActual < 10)
                    numDocumento = "0000000" + numActual.ToString();
                else if (numActual < 100)
                    numDocumento = "000000" + numActual.ToString();
                else if (numActual < 1000)
                    numDocumento = "00000" + numActual.ToString();
                else if (numActual < 10000)
                    numDocumento = "0000" + numActual.ToString();
                else if (numActual < 100000)
                    numDocumento = "000" + numActual.ToString();
                else if (numActual < 1000000)
                    numDocumento = "00" + numActual.ToString();
                else if (numActual < 1000000)
                    numDocumento = "0" + numActual.ToString();
                else if (numActual < 10000000)
                    numDocumento = numActual.ToString();
                else if (numActual > 9999999)
                {
                    throw new Exception("Limite  de Correlativo Comparativo");
                }


            }
            return numDocumento;

        }

        public string getCorrelativoGasto(dbGestionDataContext _db, int idObra)
        {
            // fecha: 04/10/2011
            //  Correlativo por empresa:
            int idEmpresa = _db.Obras.Single(p => p.idInternal == idObra).Proyecto.idEmpresa.Value;

            string numDocumento = "00000001";


            var q = from a in _db.OrdenCompras
                    where a.Obra.Proyecto.idEmpresa == idEmpresa
                    & a.idTipoOrden >1//todos los gastos
                    group a by a.Obra.Proyecto.idEmpresa into g
                    select new
                    {
                        idObra = g.Key,
                        numDocumento = g.Max(p => p.numDocumento)
                    };
            if (q.Count() > 0)
            {


                int numActual = int.Parse(q.First().numDocumento);
                //if (idEmpresa == 6)
                //{
                //    if (numActual < 10999)
                //    {
                //        numActual = 10999;
                //    }
                //}

                numActual++;
                if (numActual < 10)
                    numDocumento = "0000000" + numActual.ToString();
                else if (numActual < 100)
                    numDocumento = "000000" + numActual.ToString();
                else if (numActual < 1000)
                    numDocumento = "00000" + numActual.ToString();
                else if (numActual < 10000)
                    numDocumento = "0000" + numActual.ToString();
                else if (numActual < 100000)
                    numDocumento = "000" + numActual.ToString();
                else if (numActual < 1000000)
                    numDocumento = "00" + numActual.ToString();
                else if (numActual < 1000000)
                    numDocumento = "0" + numActual.ToString();
                else if (numActual < 10000000)
                    numDocumento = numActual.ToString();
                else if (numActual > 9999999)
                {
                    throw new Exception("Limite  de Correlativo Comparativo");
                }


            }
            return numDocumento;

        }
           
        public decimal getsubMontoTotal(dbGestionDataContext _db)
        {
            decimal result = 0;

            var q = (from i in _db.OrdenCompraItems
                     where i.idOrdenCompra == this.idInternal
                     select i);
            if (q.Count() > 0)
            {
                result = q.Sum(p => p.subMonto).Value;
            }
         


            return result;
        }
        public decimal getIGVTotalTotal(dbGestionDataContext _db)
        {
            decimal result = 0;

            var q = (from i in _db.OrdenCompraItems
                     where i.idOrdenCompra == this.idInternal
                     select i);
            if (q.Count() > 0)
            {
                result = q.Sum(p => p.IGVItem).Value;
            }
         


            return result;
        }
        public decimal getSubMontoIGVTotal(dbGestionDataContext _db)
        {
            decimal result = 0;

            var q = (from i in _db.OrdenCompraItems
                     where i.idOrdenCompra == this.idInternal
                     select i);
            if (q.Count() > 0)
            {
                result = q.Sum(p => p.subMontoIGV).Value;
            }
         


            return result;
        }


        public void UpdateComparativoEnt(int idCompatativo,int idProveedorSelec)
        {
            this.idComparativo=idCompatativo;
            this.idProveedorSelec=idProveedorSelec;
         }

        

        public void updateAutorizacion(dbGestionDataContext _db,
                            int idEmpleadoAprob,
                            string empleadoAprob,
                            string firmaAprob,
                            string FirmaComparativo,
                            int idEmpAprobComparativo
                           )
        {
            this.idEstado = 13;
            this.idAutorizado = idEmpleadoAprob;
            this.autorizado = empleadoAprob;
            this.firmaAutorizado = firmaAprob;
            this.firmaAprobComparativo = FirmaComparativo;
            this.idEmpAprobComparativo = idEmpAprobComparativo;
            _db.SubmitChanges();
        }

        //public void updateAutorizacion(dbGestionDataContext _db,
        //                    int idEmpleadoAprob,
        //                    string empleadoAprob,
        //                    string firmaAprob
        //                    )
        //{
        //    this.idEstado = 13;
        //    this.idAutorizado = idEmpleadoAprob;
        //    this.autorizado = empleadoAprob;
        //    this.firmaAutorizado = firmaAprob;
            
        //    _db.SubmitChanges();
        //}

        public void updateTotales(dbGestionDataContext _db,bool CalcularConIGV)
        {
            if (CalcularConIGV)
            {
                this.total = this.getSubMontoIGVTotal(_db);
                this.subTotal = this.getsubMontoTotal(_db);
                this.IGVTotal = this.getIGVTotalTotal(_db);
            }
            else
            {
                this.total = this.getSubMontoIGVTotal(_db);
                this.subTotal = this.total;
                this.IGVTotal = 0;
            }

            _db.SubmitChanges();
        }


        public int Add(dbGestionDataContext _db,
                            int idTipoOrden,
                            int? idRendicionCajaChica,
                            string codigo,
                            int? idComparativoProvSelec,
                            int idAlmacen,
                            string proveedor,
                            int idProveedor,
                            string contacProveedor,
                            string docProveedor,
                            string emisor,
                            int idEmpleadoEmisor,
                            DateTime fechaEmision,
                            DateTime fechaContrato,
                            DateTime fechaEntrega,
                            int idFormaPago,
                            int idMoneda,
                            string moneda,
                            decimal igv,
                            int? idComparativo,
                            decimal tipoCambio,
                            string observaciones,
                            int idObra,
                            int UsuarioCre,
                            string centroCosto,
                            int idEstructuraCompras,
                            string direccionEntrega,
                            string atencionEntrega,
                            string direccionEntComprobante,
                            bool bitInclIGV,
                            int idEstado,
                            bool bitAnticipo,
                            string observacionInter)
            
        {
            this.idAlmacen = idAlmacen;
            this.numDocumento = codigo;
            this.idProveedorSelec = idComparativoProvSelec;
            this.proveedor = proveedor;
            this.idProveedor = idProveedor;
            this.docProveedor = docProveedor;
            this.contacProveedor = contacProveedor;
            this.idTipoOrden = idTipoOrden;
            
            this.emisor = emisor;
            this.revisado = emisor;
            this.idRevisado = idEmpleadoEmisor;

            this.fechaEmision = fechaEmision;
            this.fechaContrato = fechaContrato;
            this.fechaPedido = fechaEntrega;
            
            this.idFormaPago = idFormaPago;
            this.idMoneda = idMoneda;
            this.moneda = moneda;
            this.idComparativo = idComparativo;
            this.tipoCambio = tipoCambio;
            this.observaciones = observaciones;
            this.idObra = idObra;
            this.igv = igv;
            this.fechaMod = DateTime.Now;
            this.UsuarioMod = UsuarioCre;
            this.UsuarioCre = UsuarioCre;
            this.fechaCre = DateTime.Now;
            this.centroCosto = centroCosto;
          
            this.idEstado = idEstado; //emision
            this.bitActivo = true;
            this.direccionEntrega = direccionEntrega;
            this.atencionEntrega = atencionEntrega;
            this.direccionEntComprobante = direccionEntComprobante;
            this.bitInclIGV = bitInclIGV;
            this.bitAnticipo = bitAnticipo;
            this.idEstructuraCompras = idEstructuraCompras;
                                              

            this.idRendicion = idRendicionCajaChica;
            this.observacionInter = observacionInter;
            _db.OrdenCompras.InsertOnSubmit(this);



            // auditoria antes de guardar

            AuditRecord auditRecord = new AuditRecord();
            this.idAudit = auditRecord.add(_db,
            DAL.AuditAction.Insert,
            UsuarioCre,
            this.idInternal,
            this);
   

            _db.SubmitChanges();
            return this.idInternal;

        }


        public void SetUpdateCompra(dbGestionDataContext _db,
                            string proveedor,
                            string contacProveedor,
                            string docProveedor,
                            string emisor,
                            int idEmpleadoEmisor,
                            DateTime fechaEmision,
                            DateTime fechaContrato,
                            DateTime fechaEntrega,
                            int idFormaPago,
                            int idMoneda,
                            string moneda,
                            decimal tipoCambio,
                            int idEstructuraCompras,
                            string direccionEntrega,
                            string atencionEntrega,
                            string direccionEntComprobante,
                            string observaciones,
                            int UsuarioMod,
                            bool bitAnticipo,
                            string  observacionInter)

        {
            this.idAlmacen = idAlmacen;
            this.proveedor = proveedor;
            this.contacProveedor = contacProveedor;
            this.emisor = emisor;
            this.revisado = emisor;
            this.idRevisado = UsuarioMod;
            
            this.fechaEmision = fechaEmision;
            this.fechaPedido = fechaEntrega;
            this.tipoCambio = tipoCambio;
            this.observaciones = observaciones;
            this.fechaMod = DateTime.Now;
            this.UsuarioMod = UsuarioMod;
            this.direccionEntComprobante = direccionEntComprobante;
            
            this.direccionEntrega = direccionEntrega;
            this.atencionEntrega = atencionEntrega;
            this.bitAnticipo = bitAnticipo;
            this.docProveedor = docProveedor;

            this.idRevisado = idEmpleadoEmisor;
             this.fechaContrato = fechaContrato;
             this.idFormaPago = idFormaPago;

             this.idMoneda = idMoneda;
             this.moneda = moneda;
             this.tipoCambio = tipoCambio;
             this.UsuarioMod = UsuarioMod;
             this.idEstructuraCompras = idEstructuraCompras;
             this.observacionInter = observacionInter;

        }


        public void VerificaItems(dbGestionDataContext _db)
        {

            var p = from a in _db.OrdenCompraItems
                    where a.idOrdenCompra == this.idInternal
                    select a;

            if (p.Count() == 0)
            {
                throw new Exception("La Orden de Compra no puede existir sin Items");
            
            }
            
            var q = from a in _db.OrdenCompraItems
                    where a.idOrdenCompra == this.idInternal
                    & a.Insumo.idPadre==5571
                    select a;

            if (q.Count() > 0)
            {
                throw new Exception("el Insumo :" + q.First().Descripcion + " debe ser clasificado ");
            }

            var qq = (from a in _db.OrdenCompraItems
                    where a.idOrdenCompra == this.idInternal
                    select a.Insumo.Insumo1.Insumo1.Insumo1).Distinct();

            if (qq.Count() > 1)
            {
                throw new Exception("La clase del Insumo: {0}  no pertenece a la clase {1} Genere  otra Orden de Compra"
                            .Fmt(qq.ElementAt(1).descripcion,qq.ElementAt(0).descripcion )
                            );
            }

            
        }

    }
}